package com.ouc.eddyAlgorithm.service;

import com.ouc.visualization.entity.ProfileData;
import com.ouc.visualization.entity.ProfileLineData;
import ucar.ma2.InvalidRangeException;
import ucar.nc2.NetcdfFile;

import java.io.IOException;
import java.util.concurrent.ExecutionException;

/**
 * 剖面 service 层
 */
public interface EddyProfileService {

  /**
   * 获取 nc 文件剖面对象（全部层级）
   *
   * @param fileName     nc文件全路径名
   * @param variableName 变量名
   * @param lon          经度限制条件
   * @param lat          纬度限制条件
   * @return
   * @throws IOException
   * @throws InvalidRangeException
   */
  ProfileData getProfileData(String fileName, String variableName, Float[] lon, Float[] lat) throws IOException, InvalidRangeException;

  /**
   * 获取nc文件剖面对象
   *
   * @param ncFile       nc文件
   * @param variableName 变量名
   * @param lon          经度限制条件
   * @param lat          纬度限制条件
   * @param levels       层级限制条件
   * @return
   * @throws IOException
   * @throws InvalidRangeException
   * @throws ExecutionException
   * @throws InterruptedException
   */
  ProfileData getProfileData(NetcdfFile ncFile, String variableName, Float[] lon, Float[] lat, Integer[] levels) throws IOException, InvalidRangeException, ExecutionException, InterruptedException;

  /**
   * 获取涡旋的剖面信息
   *
   * @param ncFile       nc文件
   * @param variableName 变量名
   * @param lon          涡旋经度
   * @param lat          涡旋纬度
   * @param lonDiffer    经度偏移
   * @param latDiffer    纬度偏移
   * @param degree       角度
   * @param radianFlag   是否是弧度表示形式（是填true否则填false）
   * @return 剖面信息
   * @throws IOException
   * @throws InvalidRangeException
   */
  ProfileData getEddyProfileData(NetcdfFile ncFile, String variableName, Float lon, Float lat, Float lonDiffer, Float latDiffer, Float degree, boolean radianFlag) throws IOException, InvalidRangeException;

  /**
   * 获取 nc 文件剖面廓线对象（全部层级）
   *
   * @param fileName     nc文件全路径名
   * @param variableName 变量名
   * @param lon          经度
   * @param lat          纬度
   * @return
   * @throws IOException
   * @throws InvalidRangeException
   */
  ProfileLineData getProfileLineData(String fileName, String variableName, Float lon, Float lat) throws IOException, InvalidRangeException;

}
